Previous months’ reports




1. Summary

1.1 Summary table

A total of 981,082 persons have been reached by EiE activities in 2023, of which 516,463 were boys, 447,609 were girls, 7,779 were men and 9,231 were women. Below is a summary by indicator.


Summary statistics for EIE 5Ws reporting, 31 December 2023

Indicator

Partners1

Counties

December_reached

Total_reached

Target

%Target_reached

1. Access ECD spaces/schools

19

18

190,480

652,312

1,201,151

54.31

2. Feeding programmes

12

8

14,862

170,662

784,647

21.75

3. Teaching materials

15

15

22,111

280,153

600,578

46.65

4. Safe water, personal hygiene

8

7

18,502

134,817

784,647

17.18

5. Educators resilience enhancing

23

17

3,364

14,291

6,018

237.47

6. Children resilience enhancing

14

15

3,936

143,817

154,729

92.95

7. Construction and rehabilitation

4

3

10,311

46,244

0

100.00

Total

44

21

212,6422

981,0822

2,146,545

45.71

1Only implementing partners

2Only the sum of indicators 1, 2, 5 and 6




1.2 By sex and age


Only Indicator 6, Children benefiting from resilience-enhancing programming, sees a higher proportion of females reached over men.





1.3 By county

50.19% of all beneficiaries reached originate from Turkana, though it only has 14.05% of the targeted population.


IPC data extracted from here.




1.4 Gaps

As the drought response draws to a close, it is necessary to review the allocation of resources i.e. have they been fair and proportional to the needs identified. As mentioned, county-level targets were set in line with the IPC and are considered valid.



Substantial deviation from targets has been observed, including areas such as Turkana where targets have been greatly exceeded:


Gaps between reached and targets

County

Target

Reached

Gap

Gap%

Makueni

201,321

688

200,633

99.66

Mandera

339,483

13,919

325,564

95.90

Garissa

268,844

23,088

245,756

91.41

Wajir

258,474

33,490

224,984

87.04

Baringo

86,322

13,616

72,706

84.23

Kwale

60,767

16,000

44,767

73.67

Marsabit

127,609

34,698

92,911

72.81

Samburu

72,788

27,823

44,965

61.78

Narok

83,337

34,937

48,400

58.08

West Pokot

81,626

39,381

42,245

51.75

Tana River

45,347

25,001

20,346

44.87

Isiolo

30,518

25,188

5,330

17.47

Kilifi

0

27,493

-27,493

-100.00

Taita Taveta

0

45

-45

-100.00

Meru

0

26,104

-26,104

-100.00

Kajiado

0

46,249

-46,249

-100.00

Bungoma

0

6,264

-6,264

-100.00

Homa Bay

0

188,301

-188,301

-100.00

Nairobi

0

11,343

-11,343

-100.00

Turkana

237,959

593,257

-355,298

-149.31

2. Progress by indicator


2.1.1 Overall progress


The rate of increase in the number of beneficiaries reached has yet to plateau, with only indicators 2 and 6 seeing slight slowdowns in the number of beneficiaries reached each month.




2.1.2 Reached by indicator




2.2.1 Access to ECD spaces/schools


EiE Indicator 1, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

1. Access ECD spaces/schools

19

18

190,480

652,312

1,201,151

54.31



In December 2023, 190,480 persons were reached by interventions contributing to this indicator, of which 105,118 were boys and 85,362 were girls.





2.2.2 School feeding programmes


EiE Indicator 2, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

2. Feeding programmes

12

8

14,862

170,662

784,647

21.75



In December 2023, 14,862 persons were reached by interventions contributing to this indicator, of which 7,895 were boys and 6,967 were girls.





2.2.3 Teaching and learning materials


EiE Indicator 3, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

3. Teaching materials

15

15

22,111

280,153

600,578

46.65



In December 2023, 22,111 persons were reached by interventions contributing to this indicator, of which 11,637 were boys, 10,474 were girls, 0 were men and 0 were women.





2.2.4 Safe water, personal hygiene


EiE Indicator 4, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

4. Safe water, personal hygiene

8

7

18,502

134,817

784,647

17.18



In December 2023, 18,502 persons were reached by interventions contributing to this indicator, of which 10,621 were boys and 7,881 and were girls.





2.2.5 Educators trained in resilience enhancing programmes


EiE Indicator 5, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

5. Educators resilience enhancing

23

17

3,364

14,291

6,018

237.47



In December 2023, 3,364 persons were reached by interventions contributing to this indicator, of which 1,260 were men and 2,104 and were women.





2.2.6 Children benefited from resilience enhancing programmes


EiE Indicator 6, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

6. Children resilience enhancing

14

15

3,936

143,817

154,729

92.95



In December 2023, 3,936 persons were reached by interventions contributing to this indicator, of which 1,940 were boys and 1,996 and were girls.





2.2.7 Children benefited from construction and rehabilitation


EiE Indicator 7, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

7. Construction and rehabilitation

4

3

10,311

46,244

0

100


To note: targets have not been set for indicator 7.



In December 2023, 10,311 persons were reached by interventions contributing to this indicator, of which 2,032 were boys and 950 and were girls.

This activity has no targets.




3. Partners

3.1 Operational presence of implementing partners



Below is an interactive table which adds detail to the map above, serving additional information for coordination – allowing interested parties to search by county or partner.

The column #Activities refers to the number of Education activities implemented by said partner in each county. Each column can be sorted with the arrows next to each column name. Each column can also be filtered by typing into the search bar below each column name. Only completed activities have been included.

Download the dataset from the table below here.





3.2 Summary by implementing partner

The table below breaks down persons reached by partner.


Summary by implementing partner

implementing_partner

reached1

counties

activities

%total2

Finn Church Aid

604,633

5

7

41.92

Jesuit Refugee Service

115,782

1

4

8.03

Women Educational Researchers of Kenya

103,880

5

4

7.20

Windle International

75,994

1

3

5.27

Save the Children

64,437

5

3

4.47

Lifeskills Promoters

62,311

3

5

4.32

Food for the Hungry

60,532

2

7

4.20

Norwegian Refugee Council

59,623

2

5

4.13

Lutheran World Federation

52,322

1

4

3.63

County Director of Education

39,286

14

1

2.72

World Vision Kenya

35,584

6

6

2.47

UNICEF

34,732

2

1

2.41

Feed the Children

28,711

3

1

1.99

Homa Bay County

23,166

1

1

1.61

We World

20,947

2

1

1.45

AVSI Foundation

9,768

2

3

0.68

Ministry of Education

8,294

2

2

0.58

Special Olympics Kenya

6,753

11

3

0.47

Nawiri Children Development Program

6,652

5

2

0.46

Qatar Charity

4,757

1

1

0.33

Edukans

4,734

1

1

0.33

Action for Sustainable Change

4,160

1

3

0.29

HABIBA International

2,978

1

1

0.21

County Director of Education Marsabit

2,659

1

2

0.18

Mondi

2,197

1

1

0.15

The Girl Child Network

1,050

2

1

0.07

Frontiers Community Development Organization

1,044

1

1

0.07

Tana North and Tana Delta

882

1

1

0.06

Bartabwa

849

1

1

0.06

Evangelizing Sisters of Mary

737

1

4

0.05

County Director of Education Mandera

600

1

2

0.04

Missionary Sisters of the Catechism

585

1

1

0.04

County Director of Education Wajir

409

1

2

0.03

SMB

270

1

1

0.02

MoE, KNATCOM, STEM Impact Centre

260

2

1

0.02

ERIKs Development Partner

249

1

1

0.02

Servants of the Poor

202

1

1

0.01

Dignitas

135

1

1

0.01

MOE/TSC

60

1

1

0.00

Voluntary Service Overseas

42

1

1

0.00

Futebol da Forcaa

20

1

1

0.00

IWS

10

1

2

0.00

1All indicators as opposed only indicators 1, 2, 5 and 6

2Percentage of reached for all indicators




3.3 Summary by lead_organisation

Summary by lead organisation

lead_organisation

reached1

counties

activities

%total2

UNICEF

520,881

14

6

36.11

Finn Church Aid

418,489

5

6

29.02

Food for the Hungry

60,532

2

7

4.20

Save the Children

54,871

5

3

3.80

Lutheran World Federation

52,322

1

4

3.63

Lifeskills Promoters

47,157

3

4

3.27

World Vision Kenya

46,871

7

6

3.25

County Director of Education

41,945

15

1

2.91

Jesuit Refugee Service

37,430

1

4

2.60

Feed the Children

28,711

3

1

1.99

Population Council

23,166

1

1

1.61

We World

20,947

2

1

1.45

Women Educational Researchers of Kenya

20,747

5

1

1.44

Windle International

18,687

1

1

1.30

AVSI Foundation

10,902

5

6

0.76

ChildFund Kenya

7,696

5

2

0.53

Norwegian Refugee Council

6,709

2

5

0.47

Special Olympics Kenya

4,892

11

1

0.34

Qatar Charity

4,757

1

1

0.33

Edukans

4,734

1

1

0.33

Action for Sustainable Change

4,160

1

3

0.29

HABIBA International

2,978

1

1

0.21

UNESCO

1,330

3

3

0.09

Missionary Sisters of the Catechism

500

1

1

0.03

Voluntary Service Overseas

291

2

1

0.02

Dignitas

135

1

1

0.01

SMB

135

1

1

0.01

KENYA NATIONAL COMMISSION FOR UNESCO

115

1

2

0.01

Life Skills Promoters

111

1

2

0.01

MOE/TSC

60

1

1

0.00

Evangelizing Sisters of Mary

35

1

1

0.00

1All indicators as opposed only indicators 1, 2, 5 and 6

2Percentage of reached for all indicators

4. Schools and education level

4.1 Schools

The number of schools reached by school feeding programmes and WASH in schools interventions to-date are:



However, reporting the overall number of schools reached by all EiE interventions is much more challenging.

Whilst all partners working on indicators 2 and 4 submitted the number of schools they were working in, the same is not true for the other indicators. Only indicators 2 and 4 require the reporting of the number of schools.

Additionally, it is not possible to know which of these schools are repeats, since only the number of schools reached per sub-county are reported, not the individual facilites themselves.




5. Reference maps and tables

5.1 Reference maps

IPC data extracted from here.




5.2 Reference table

Download the EiE 5Ws data here

As a refresher for the reference table below, the indicators are:


indicator

indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas

indicator 2 # of schools/ECD spaces with feeding programmes

indicator 3 # of learners and teachers reached with learning and teaching materials

indicator 3 #of learners reaached and teachers reached with learning and teaching materials

indicator 4 # of school with adequate quantity of safe water for drinking and personal hygiene

indicator 4 # of schools with adequate quantities of safe water for drinking and personal hygiene

indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc)

indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc)

indicator 7 # of children benefitting from child-friendly environment (any construction or rehabilitation)





LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiMzEgRGVjZW1iZXIgMjAyMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGNvbGxhcHNlZDogbm8NCmFsd2F5c19hbGxvd19odG1sOiB5ZXMNCnBhcmFtczogDQogIHJlcG9ydF9kYXRlOiAiMzEgRGVjZW1iZXIgMjAyMyINCiAgcmVwb3J0X21vbnRoOiAiRGVjZW1iZXIiDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQoNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KYGBge3IgZGF0YX0NCiMgUnVuIHRoaXMgaWYgeW91IG5lZWQgdG8NCiMgcm1hcmtkb3duOjpyZW5kZXIoaW5wdXQgPSAiNVdzX2NsZWFuaW5nX3NjcmlwdC5SbWQiKQ0KDQpsb2NhdGlvbnMgPC0gcmVhZF94bHN4KCIuL2RhdGEva2VuX2FkbWluYm91bmRhcmllc190YWJ1bGFyZGF0YS54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQURNMiIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQpzaXRyZXBfdGFibGUgPC0gcmVhZF94bHN4KCIuL2RhdGEvc2l0cmVwX3Jlc3VsdHNfdGFibGUueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQp0YXJnZXRzIDwtIHJlYWRfY3N2KCIuL2RhdGEvZWllX3RhcmdldHMuY3N2IikNCg0KcGNvZGUxX3NoYXBlIDwtIA0KICBzZjo6c3RfcmVhZCgiLi9kYXRhL2tlbl9hZG1faWViY18yMDE5MTAzMV9zaHAva2VuX2FkbWJuZGFfYWRtMV9pZWJjXzIwMTkxMDMxLnNocCIsIA0KICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmlwYyA8LSByZWFkX2NzdigiLi9kYXRhL2lwYy5jc3YiKQ0KDQpwYXJ0bmVyX2xpc3RfY291bnRpZXMgPC0gcmVhZF9jc3YoIi4vZGF0YS9wYXJ0bmVyX2xpc3RfY291bnRpZXMuY3N2IikgJT4lIA0KICBmaWx0ZXIocGFydG5lcl90eXBlID09ICJpbXBsZW1lbnRpbmdfcGFydG5lciIpDQoNCmVpZSA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV81d3MuY3N2IikgJT4lIA0KICAjIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYm95cyA9IDAsIGdpcmxzID0gMCwgbWVuID0gMCwgd29tZW4gPSAwKSkgJT4lIA0KICAjIFRvdGFsIHJlYWNoZWQgb2YgaW5kaWNhdG9yIDEgaXMgb25seSBib3lzIGFuZCBnaXJscyANCiAgbXV0YXRlKHRvdGFsX3JlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYWNjZXNzaW5nIEVDRCBzcGFjZXMvc2Nob29scyBpbiBkcm91Z2h0IGFmZmVjdGVkIGFyZWFzIikgfiANCiAgICAgIGJveXMgKyBnaXJscywNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvciwgIjUgI3w1LjF8NS4yfDUuMyIpIH4gbWVuICsgd29tZW4sDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiKSB+IGJveXMgKyBnaXJscywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiB0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBtdXRhdGUobGVhZF9vcmdhbmlzYXRpb24gPSBpZmVsc2UoaXMubmEobGVhZF9vcmdhbmlzYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRfb3JnYW5pc2F0aW9uKSkNCg0KYGBgDQoNCltQcmV2aW91cyBtb250aHMnIHJlcG9ydHNdKGh0dHBzOi8va2VueWEtZWllLXdnLmdpdGh1Yi5pby8pDQoNCjxicj48YnI+PGJyPg0KDQojIDEuIFN1bW1hcnkNCg0KIyMgMS4xIFN1bW1hcnkgdGFibGUNCg0KYGBge3J9DQpzdW1fc3RhdHMgPC0gZWllICU+JSAgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChjb3VudHkpLCANCiAgICAgICAgICAgIHJlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgbWVuID0gc3VtKG1lbltzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjJ8NSIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB3b21lbiA9IHN1bSh3b21lbltzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjJ8NSIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBib3lzID0gc3VtKGJveXNbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NiIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgcmVhY2hlZF8xMjU2ID0gc3VtKHRvdGFsX3JlYWNoZWRbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIiYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KDQoNCg0KYGBgDQoNCkEgdG90YWwgb2YgYHIgc3VtX3N0YXRzICU+JSBwdWxsKHJlYWNoZWRfMTI1NikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgRWlFIGFjdGl2aXRpZXMgaW4gMjAyMywgb2Ygd2hpY2ggYHIgc3VtX3N0YXRzICU+JSBwdWxsKGJveXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMsIGByIHN1bV9zdGF0cyAlPiUgcHVsbChnaXJscykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMsIGByIHN1bV9zdGF0cyAlPiUgcHVsbChtZW4pICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgc3VtX3N0YXRzICU+JSBwdWxsKHdvbWVuKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSB3b21lbi4gQmVsb3cgaXMgYSBzdW1tYXJ5IGJ5IGluZGljYXRvci4NCg0KPGJyPg0KDQpgYGB7cn0NCg0KDQpzdW1tYXJ5X3RhYmxlIDwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGxhdGVzdF9yZWFjaGVkID0gaWZlbHNlKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCwgdG90YWxfcmVhY2hlZCwgTkFfaW50ZWdlcl8pKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoYWRtMV9wY29kZSksICAgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bShsYXRlc3RfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB0b3RhbF9yZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCwsLCBsYXRlc3RfcmVhY2hlZCwgdG90YWxfcmVhY2hlZCkgJT4lIA0KICBtdXRhdGUocGFydG5lcnMgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIHN1bV9zdGF0cyRwYXJ0bmVycywgcGFydG5lcnMpLCANCiAgICAgICAgIGNvdW50aWVzID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCBzdW1fc3RhdHMkY291bnRpZXMsIGNvdW50aWVzKSwgDQogICAgICAgICB0b3RhbF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3N0YXRzJHJlYWNoZWRfMTI1NiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQpLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGF0cyRsYXRlc3RfcmVhY2hlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGNvdW50eV90YXJnZXQpKSwgDQogICAgICAgICAgICBieSA9ICJpbmRpY2F0b3Jfc2hvcnQiKSAlPiUgDQogIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBtdXRhdGUodGFyZ2V0ID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzICU+JSBkaXN0aW5jdChjb3VudHksIGNvdW50eV9vdmVyYWxsX3RhcmdldCkgJT4lIHtzdW0oLiRjb3VudHlfb3ZlcmFsbF90YXJnZXQpfSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KSwgDQogICAgICAgICB0YXJnZXQgPSBpZmVsc2UoaXMubmEodGFyZ2V0KSwgMCwgdGFyZ2V0KSkgJT4lIA0KICBtdXRhdGUocGMgPSByb3VuZCh0b3RhbF9yZWFjaGVkIC8gdGFyZ2V0ICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwYyA9IGlmZWxzZShpcy5pbmZpbml0ZShwYyksIDEwMCwgcGMpKSAlPiUNCiAgc2VsZWN0KGluZGljYXRvciA9IGluZGljYXRvcl9zaG9ydCwgcGFydG5lcnMsIGNvdW50aWVzLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkLCB0b3RhbF9yZWFjaGVkLCB0YXJnZXQsIGAldGFyZ2V0X3JlYWNoZWRgID0gcGMpICU+JQ0KICBzZWxlY3RfYWxsKH4gZ3N1YigibGF0ZXN0IiwgDQogICAgICAgICAgICAgICAgICAgIHBhcmFtcyRyZXBvcnRfbW9udGgsIC4pKSAlPiUNCiAgc2VsZWN0X2FsbCh+IHN0cl90b190aXRsZSguKSkgIA0KDQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIEVJRSA1V3MgcmVwb3J0aW5nLCAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgZm9udHNpemUoaSA9IDE6NywgaiA9IDEsIHNpemUgPSA5KSAlPiUgDQogIGZvbnRzaXplKHNpemUgPSA5LCBwYXJ0ID0gImhlYWRlciIpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSAyLCBwYXJ0ID0gImhlYWRlciIsIHJlZl9zeW1ib2xzID0gIjEiLCANCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJPbmx5IGltcGxlbWVudGluZyBwYXJ0bmVycyIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSA4LCBqID0gNDo1LCByZWZfc3ltYm9scyA9ICIyIiwgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiT25seSB0aGUgc3VtIG9mIGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKQ0KDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLjIgQnkgc2V4IGFuZCBhZ2UNCg0KYGBge3J9DQplaWUgJT4lIA0KICBtdXRhdGUoaW5kaWNhdG9yX3Nob3J0ID0gZmN0X3JldihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMobWVuLCB3b21lbiksIH4gaWZlbHNlKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiMSIpLCAwLCAuKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHN1bSguLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9yZWFjaGVkID0gYm95cyArIGdpcmxzICsgbWVuICsgd29tZW4sIA0KICAgICAgICAgZmVtYWxlID0gKHdvbWVuICsgZ2lybHMpIC8gdG90YWxfcmVhY2hlZCwgDQogICAgICAgICBtYWxlID0gKGJveXMgKyBtZW4pIC8gdG90YWxfcmVhY2hlZCkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhmZW1hbGUsIG1hbGUpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNleCIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBjIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGluZGljYXRvcl9zaG9ydCwgZmlsbCA9IHNleCkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gcGMsIA0KICAgICAgICAgICAgICAgIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIA0KICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAxKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzQ0Mzk4MyIsICIjMzViNzc5IikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlNleCBicmVha2Rvd24gYnkgaW5kaWNhdG9yIikgIA0KDQpgYGANCg0KPGJyPg0KDQpPbmx5IEluZGljYXRvciA2LCBDaGlsZHJlbiBiZW5lZml0aW5nIGZyb20gcmVzaWxpZW5jZS1lbmhhbmNpbmcgcHJvZ3JhbW1pbmcsIHNlZXMgYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBmZW1hbGVzIHJlYWNoZWQgb3ZlciBtZW4uDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGVfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhtZW4sIHdvbWVuLCBib3lzLCBnaXJscyksIH4gc3VtKC4pKSAlPiUgDQogIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMobWVuLCB3b21lbiwgYm95cywgZ2lybHMpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyZWFjaGVkIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IHN0cl90b190aXRsZSh0eXBlKSwgDQogICAgICAgICB0eXBlID0gZmN0X3JlbGV2ZWwodHlwZSwgYygiTWVuIiwgIldvbWVuIiwgIkJveXMiLCAiR2lybHMiKSkpICU+JSANCiAgIyBZb3UncmUganVzdCBmaWx0ZXJpbmcgdGhlbSBvdXQgbWFudWFsbHkNCiAgbXV0YXRlKHJlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiB0eXBlID09ICJCb3lzIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgdHlwZSA9PSAiR2lybHMiIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJNZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJXb21lbiIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIHR5cGUgPT0gIk1lbiIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIHR5cGUgPT0gIldvbWVuIiB+IDAsDQogICAgVFJVRSB+IHJlYWNoZWQNCiAgKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSB0eXBlLCB4ID0gcmVhY2hlZCwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShyZWFjaGVkKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBudW1iZXJfZm9ybWF0KHNjYWxlID0gMSAvIDEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMiwgZW5kID0gLjkpICsgDQogIGZhY2V0X3dyYXAofiBpbmRpY2F0b3Jfc2hvcnQpICsgDQogIGxhYnMoeCA9ICJQZXJzb25zIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlJlYWNoIGRpc2FnZ3JlZ2F0ZWQgYnkgc2V4LCBhZ2UgYW5kIGluZGljYXRvciIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLjMgQnkgY291bnR5DQoNCmBgYHtyfQ0KY3VtX3BjPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKHBjX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX3RhcmdldCA9IHJvdW5kKHRhcmdldCAvIHN1bSh0YXJnZXQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGN1bV9wYyA9IGN1bXN1bShwY19iZW4pKQ0KYGBgDQoNCmByIGN1bV9wYyAlPiUgZmlsdGVyKGNvdW50eSA9PSAiVHVya2FuYSIpICU+JSBwdWxsKGN1bV9wYylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkIG9yaWdpbmF0ZSBmcm9tIFR1cmthbmEsIHRob3VnaCBpdCBvbmx5IGhhcyBgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChwY190YXJnZXQpYCUgb2YgdGhlIHRhcmdldGVkIHBvcHVsYXRpb24uDQoNCjxicj4NCg0KYGBge3J9DQoNCmVpZSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgIA0KICBtdXRhdGUoY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBzZWN0b3JfcmVhY2hlZCkpICU+JSANCiAgZmlsdGVyKHNlY3Rvcl9yZWFjaGVkID4gMCB8IHRhcmdldCA+IDApICU+JSANCiAgbGVmdF9qb2luKGlwYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG0xX3Bjb2RlLCBwZXJjZW50X3BoYXNlX3AzKSwgDQogICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoc2VjdG9yX3JlYWNoZWQsIHRhcmdldCksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidHlwZSIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IGlmZWxzZSh0eXBlID09ICJ0YXJnZXQiLCAiQ291bnR5IFRhcmdldCIsICJTZWN0b3IgUmVhY2hlZCIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh2YWx1ZSA9IDApKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUsIA0KICAgICAgICAgICAgIHkgPSBjb3VudHksIA0KICAgICAgICAgICAgIGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEodmFsdWUpKSwgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEvMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQpICsgDQogIGZhY2V0X2dyaWQofiB0eXBlLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQzMrIiwNCiAgICAgICB4ID0gIlRhcmdldC9yZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICBjYXB0aW9uID0gIkNvbG91cnMgcmVmZXIgdG8gJSBvZiBjb3VudHkgcG9wdWxhdGlvbiBpbiBJUEMgcGhhc2UgMyBvciBhYm92ZS4gSG9tYSBCYXkgd2FzIG5vdCBhc3Nlc3NlZCBhcyBwYXJ0IG9mIHRoZSBJUEMgQ2xhc3NpZmljYXRpb24iLCANCiAgICAgICB0aXRsZSA9ICJDb21wYXJpc29uIGJldHdlZW4gdGFyZ2V0cyBhbmQgcmVhY2hlZCIpICsNCiAgdGhlbWUoIyBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgIyBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkNCmBgYA0KDQpJUEMgZGF0YSBleHRyYWN0ZWQgZnJvbSBbaGVyZV0oaHR0cHM6Ly93d3cuaXBjaW5mby5vcmcvaXBjLWNvdW50cnktYW5hbHlzaXMvZGV0YWlscy1tYXAvZW4vYy8xMTU2MjEwLz9pc28zPUtFTikuDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLjQgR2Fwcw0KDQpBcyB0aGUgZHJvdWdodCByZXNwb25zZSBkcmF3cyB0byBhIGNsb3NlLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV2aWV3IHRoZSBhbGxvY2F0aW9uIG9mIHJlc291cmNlcyBpLmUuIGhhdmUgdGhleSBiZWVuIGZhaXIgYW5kIHByb3BvcnRpb25hbCB0byB0aGUgbmVlZHMgaWRlbnRpZmllZC4gQXMgbWVudGlvbmVkLCBjb3VudHktbGV2ZWwgdGFyZ2V0cyB3ZXJlIHNldCBpbiBsaW5lIHdpdGggdGhlIElQQyBhbmQgYXJlIGNvbnNpZGVyZWQgdmFsaWQuDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD03fQ0KZWllICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSAgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUoZ2FwID0gdGFyZ2V0IC0gc2VjdG9yX3JlYWNoZWQsIA0KICAgICAgICAgZ2FwX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKGdhcCAvIHRhcmdldCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBnYXAgLyB0YXJnZXQpKSAlPiUgIA0KICBtdXRhdGVfYXQodmFycyhzZWN0b3JfcmVhY2hlZCwgdGFyZ2V0LCBnYXAsIGdhcF9wYyksIH4gYXMubnVtZXJpYyguKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIG11dGF0ZShsYWJlbCA9IHBhc3RlMChjb21tYShnYXApLCAiXG4iLCBwZXJjZW50KGdhcF9wYykpLCANCiAgICAgICAgIGxhYmVsID0gaWZlbHNlKHN0cl9kZXRlY3QobGFiZWwsICJOQSIpLCAiIiwgbGFiZWwpKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IDAuMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gZ2FwX3BjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTUwIiwgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gInR1cmJvIiwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4zLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLTEsIC0uNSwgMCwgLjUsIC45OSkpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKHRpdGxlID0gIkdhcHMgaW4gRHJvdWdodCBSZXNwb25zZSIsDQogICAgICAgc3VidGl0bGUgPSAiSW4gdGVybXMgb2YgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kICUgb2YgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIkdhcCAlIikNCiAgDQogIA0KYGBgDQoNCjxicj4NCg0KU3Vic3RhbnRpYWwgZGV2aWF0aW9uIGZyb20gdGFyZ2V0cyBoYXMgYmVlbiBvYnNlcnZlZCwgaW5jbHVkaW5nIGFyZWFzIHN1Y2ggYXMgVHVya2FuYSB3aGVyZSB0YXJnZXRzIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSAgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUoZ2FwID0gdGFyZ2V0IC0gc2VjdG9yX3JlYWNoZWQsIA0KICAgICAgICAgZ2FwX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKGdhcCAvIHRhcmdldCAqIDEwMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGdhcCAvIHRhcmdldCAqIDEwMCwgZGlnaXRzID0gMikpKSAlPiUgDQogIHNlbGVjdChDb3VudHkgPSBjb3VudHksIA0KICAgICAgICAgVGFyZ2V0ID0gdGFyZ2V0LA0KICAgICAgICAgUmVhY2hlZCA9IHNlY3Rvcl9yZWFjaGVkLCANCiAgICAgICAgIEdhcCA9IGdhcCwgDQogICAgICAgICBgR2FwJWAgPSBnYXBfcGMpICU+JSANCiAgYXJyYW5nZShkZXNjKGBHYXAlYCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC43KSAlPiUgDQogIHNldF9jYXB0aW9uKCJHYXBzIGJldHdlZW4gcmVhY2hlZCBhbmQgdGFyZ2V0cyIpDQpgYGANCg0KIyAyLiBQcm9ncmVzcyBieSBpbmRpY2F0b3INCg0KPGJyPg0KDQojIyAyLjEuMSBPdmVyYWxsIHByb2dyZXNzDQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCg0KbGluZV92YWx1ZXMgPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkNCg0KDQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBncm91cF9ieShkYXRlLCBpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbiwgY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgc3RhdF9zbW9vdGgoZ2VvbSA9ICJsaW5lIiwgYXBoYSA9IC4zLCBzcGFuID0gLjUpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIHggPSAtSW5mLCB5ID0gSW5mLCBoanVzdCA9IC0wLjE1LCB2anVzdCA9IDAuOSwgZGF0YSA9IGxpbmVfdmFsdWVzKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBmYWNldF93cmFwKH5pbmRpY2F0b3Jfc2hvcnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBpbnRlcnZlbnRpb25zIiwgDQogICAgICAgdGl0bGUgPSBwYXN0ZTAoIk1vbnRobHkgcHJvZ3Jlc3MgYnkgYWN0aXZpdHksICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSksDQogICAgICAgc3VidGl0bGUgPSAiSW5kaWNhdG9yIHN1YnRvdGFsIGluIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaCBmYWNldCIpIA0KICANCg0KDQpgYGANCg0KPGJyPg0KDQpUaGUgcmF0ZSBvZiBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBoYXMgeWV0IHRvIHBsYXRlYXUsIHdpdGggb25seSBpbmRpY2F0b3JzIDIgYW5kIDYgc2VlaW5nIHNsaWdodCBzbG93ZG93bnMgaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgZWFjaCBtb250aC4NCg0KPGJyPjxicj48YnI+DQoNCiMjIDIuMS4yIFJlYWNoZWQgYnkgaW5kaWNhdG9yDQoNCg0KYGBge3J9DQplaWUgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZWFjaGVkLCB5ID0gZmN0X3JldihpbmRpY2F0b3Jfc2hvcnQpKSkgKyANCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBpbmRpY2F0b3Jfc2hvcnQpKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gLjgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShyZWFjaGVkKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGxhYnMoeCA9IHBhc3RlMCgiVG90YWwgcmVhY2hlZCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlBlcnNvbnMgcmVhY2hlZCBieSBlYWNoIEVpRSBpbmRpY2F0b3IiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCmBgYHtyfQ0KYmVuX3Bsb3QgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICAgIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBjb3VudHkpKSArIA0KICAgIGdlb21fY29sKGFlcyhmaWxsID0gcGMpKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpLCBoanVzdCA9ICJpbndhcmQiKSwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiKSArIA0KICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCwgYmVnaW4gPSAuMikgKyANCiAgICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgICAgeCA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgICB5ID0gIiIsIA0KICAgICAgICAgZmlsbCA9ICIlIHJlYWNoZWQiKSANCn0NCg0KcGNfcGxvdCA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBjb3VudHkpKSArIA0KICAgIGdlb21fY29sKGFlcyhmaWxsID0gcGMpKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IC4xKSwgaGp1c3QgPSAiaW53YXJkIiksIA0KICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IikgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCwgYmVnaW4gPSAuMikgKyANCiAgICBsYWJzKHRpdGxlID0gIiUgb2YgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICAgIHggPSAiJSByZWFjaGVkIiwgDQogICAgICAgICB5ID0gIiIsIA0KICAgICAgICAgZmlsbCA9ICIlIHJlYWNoZWQiKSArDQogICAgDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0KdGFyZ2V0c19yYW5nZSA8LSB0YXJnZXRzICU+JSANCiAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZSh0YXJnZXQgPSBzdW0oY291bnR5X3RhcmdldCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW5kaWNhdG9yX3Nob3J0LCB2YWx1ZXNfZnJvbSA9IHRhcmdldCkgJT4lIA0KICBzZXROYW1lcyhjKCJjb3VudHkiLCAiaW5kaWNhdG9yMSIsICJpbmRpY2F0b3IyIiwgImluZGljYXRvcjMiLCAiaW5kaWNhdG9yNCIsIA0KICAgICAgICAgICAgICJpbmRpY2F0b3I1IiwgImluZGljYXRvcjYiKSkgJT4lIA0KICBtdXRhdGUoaW5kaWNhdG9yNyA9IDApDQoNCmluZGljYXRvcl9tYXAgPC0gZnVuY3Rpb24odGJsLCBpbmRpY2F0b3JfbnVtYmVyLCBwbG90X29wdGlvbikgew0KICANCiAgcGxvdF9vcHRpb24gPC0gZW5xdW8ocGxvdF9vcHRpb24pDQogIGluZGljYXRvcl9udW1iZXIgPC0gZW5xdW8oaW5kaWNhdG9yX251bWJlcikNCiAgDQogIHRibCAlPiUgDQogICAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAhIWluZGljYXRvcl9udW1iZXIpKSAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgISFpbmRpY2F0b3JfbnVtYmVyKSkgJT4lDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDAgfCBjb3VudHlfdGFyZ2V0ID4gMCkgICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBuYW5pYXI6OnJlcGxhY2Vfd2l0aF9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIA0KICAgICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSA9IGFkbTFfZW4sIGFkbTFfcGNvZGUpLCANCiAgICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICAgIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCBieSA9IGMoImFkbTFfcGNvZGUiKSkgJT4lDQogICAgc3RfYXNfc2YoKSAlPiUgDQogICAgZ2dwbG90KCkgKyANCiAgICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICAgIGFlcyhmaWxsID0gISFwbG90X29wdGlvbikpICsgDQogICAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKCEhcGxvdF9vcHRpb24pKSwNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsDQogICAgICAgICAgICAgICAgIHNpemUgPSAyLjUpICsgDQogICAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogICAgdGhlbWVfdm9pZCgpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkNCiAgICANCn0NCg0KYGBgDQoNCiMjIyAyLjIuMSBBY2Nlc3MgdG8gRUNEIHNwYWNlcy9zY2hvb2xzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiMSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDEsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkNCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IxKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBBY2Nlc3MgdG8gRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMuDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMS4gQ2hpbGRyZW4gYWNjZXNzaW5nIEVDRCBzcGFjZXMvc2Nob29scywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCiANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi4yIFNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIyIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMiwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIyIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIyIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMi4gU2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIEZlZWRpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi4zIFRlYWNoaW5nIGFuZCBsZWFybmluZyBtYXRlcmlhbHMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIzIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMywgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIzIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIzIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMyksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMy4gVGVhY2hpbmcgYW5kIGxlYXJuaW5nIG1hdGVyaWFscywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHdvbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSB3b21lbi4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjMuIFRlYWNoaW5nIG1hdGVyaWFscyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi40IFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI0IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNCwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI0IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI0IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNCksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNC4gU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZSwgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgZ2lybHMuDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi41IEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI1IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNSwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI1IiwgY291bnR5X3RhcmdldCkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhuYS52YWx1ZSA9ICJncmV5ODAiLCBsaW1pdHMgPSByYW5nZShjKDAsIDE4MTMpKSkgKyANCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNSIsIGJlbmVmaWNpYXJpZXMpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjUuIEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJG1lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgbWVuIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR3b21lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIHdvbWVuLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI1LiBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi42IENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI2IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNiwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI2IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI2IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNi4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNi4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNyBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSBjb25zdHJ1Y3Rpb24gYW5kIHJlaGFiaWxpdGF0aW9uDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNyIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDcsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpUbyBub3RlOiB0YXJnZXRzIGhhdmUgbm90IGJlZW4gc2V0IGZvciBpbmRpY2F0b3IgNy4NCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNyIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNyIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjYpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjcuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjciKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgZ2lybHMuDQoNClRoaXMgYWN0aXZpdHkgaGFzIG5vIHRhcmdldHMuDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIFBhcnRuZXJzDQoNCiMjIDMuMSBPcGVyYXRpb25hbCBwcmVzZW5jZSBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMNCg0KPGJyPg0KDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9N30NCg0KcGFydG5lcl9tYXAgPC0gZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGxlYWRfb3JnYW5pc2F0aW9uID0gbl9kaXN0aW5jdChsZWFkX29yZ2FuaXNhdGlvbiksDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpLCANCiAgICAgICAgICAgIHdvbWVuID0gc3VtKHdvbWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBtZW4gPSBzdW0obWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUocmVhY2hlZCA9IG1lbiArIHdvbWVuICsgYm95cyArIGdpcmxzLCANCiAgICAgICAgIG1hbGUgPSBtZW4gKyBib3lzLCANCiAgICAgICAgIGZlbWFsZSA9IHdvbWVuICsgZ2lybHMsIA0KICAgICAgICAgbWFsZV9wYyA9IHJvdW5kKG1hbGUgLyByZWFjaGVkICogMTAwKSwgDQogICAgICAgICBmZW1hbGVfcGMgPSByb3VuZChmZW1hbGUgLyByZWFjaGVkICogMTAwKSkgJT4lICANCiAgbGVmdF9qb2luKHBhcnRuZXJfbGlzdF9jb3VudGllcyAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoYWRtMV9wY29kZSwgYWNyb255bSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbTFfcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGFjcm9ueW0pICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGFjcm9ueW0gPSBwYXN0ZTAoYWNyb255bSwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShhY3JvbnltID0gc3RyX3JlcGxhY2VfYWxsKGFjcm9ueW0sICJDaGlsZEZ1bmQiLCAiQ0YiKSwgDQogICAgICAgICAgICAgICAgICAgICBuX3BhcnRuZXJzID0gc3RyX2NvdW50KGFjcm9ueW0sICIsIikgKyAxKSwgDQogICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgZGF0YSA9IHBjb2RlMV9zaGFwZSkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwYXJ0bmVycywgDQogICAgICAgICAgICAgIGNvbG91ciA9IGFkbTFfcGNvZGUpKSArDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoIA0KICAgIGNvdW50eSwgIlxuIiwgcGFydG5lcnMpLCANCiAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgICAgICAgICAgICJDb3VudHk6ICIsIGNvdW50eSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIlBhcnRuZXJzOiAiLCBuX3BhcnRuZXJzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAiUmVhY2hlZDogIiwgY29tbWEodG90YWxfcmVhY2hlZCksICJcbiIsIA0KICAgICAgICAgICAgICAgICJGZW1hbGVfcmVhY2hlZCU6ICIsIGZlbWFsZV9wYywgIiUsICIsICJNYWxlX3JlYWNoZWQlOiAiLCBtYWxlX3BjLCAiJSIsIA0KICAgICAgICAgICAgICAgICJcbiIsICANCiAgICAgICAgICAgICAgICBhY3JvbnltKSksIA0KICAgICAgICAgICAgICAgIHNpemUgPSAzLCBjb2xvdXIgPSAiZ3JheTQwIikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxLCAzLCA2LCAxMCkpICsgDQogIA0KICB0aGVtZV92b2lkKCkgKyANCiAgIyBSZW1lbWJlciB0aGF0IHlvdSBuZWVkIGd1aWRlX2NvbG9yYmFyLCBub3QgZ3VpZGVfbGVnZW5kDQogICMgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihyZXZlcnNlID0gVFJVRSkpICsgDQogIGxhYnModGl0bGUgPSAiRWR1Y2F0aW9uIGluIEVtZXJnZW5jaWVzIFdvcmtpbmcgR3JvdXAgb3BlcmF0aW9uYWwgcHJlc2VuY2UiLCANCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSwgDQogICAgICAgZmlsbCA9ICJQYXJ0bmVycyIpDQoNCg0KZ2dwbG90bHkocGFydG5lcl9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKHN1bV9zdGF0cyRwYXJ0bmVycywgIiBFaUUgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGFjcm9zcyAiLCBzdW1fc3RhdHMkY291bnRpZXMsICIgY291bnRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUsICI7IG1vdXNlIG92ZXIgY291bnR5IG5hbWUgZm9yIG1vcmUgZGV0YWlscyIsICI8L3N1cD4iKSkpDQpgYGANCg0KPGJyPg0KDQpCZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSB0YWJsZSB3aGljaCBhZGRzIGRldGFpbCB0byB0aGUgbWFwIGFib3ZlLCBzZXJ2aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGNvb3JkaW5hdGlvbiAtLSBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc2VhcmNoIGJ5IGNvdW50eSBvciBwYXJ0bmVyLg0KDQpUaGUgY29sdW1uIGAjQWN0aXZpdGllc2AgcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgRWR1Y2F0aW9uIGFjdGl2aXRpZXMgaW1wbGVtZW50ZWQgYnkgc2FpZCBwYXJ0bmVyIGluIGVhY2ggY291bnR5LiBFYWNoIGNvbHVtbiBjYW4gYmUgc29ydGVkIHdpdGggdGhlIGFycm93cyBuZXh0IHRvIGVhY2ggY29sdW1uIG5hbWUuIEVhY2ggY29sdW1uIGNhbiBhbHNvIGJlIGZpbHRlcmVkIGJ5IHR5cGluZyBpbnRvIHRoZSBzZWFyY2ggYmFyIGJlbG93IGVhY2ggY29sdW1uIG5hbWUuIE9ubHkgY29tcGxldGVkIGFjdGl2aXRpZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHdyaXRlX2NzdigiLi9kYXRhL2JyZWFrZG93bl9ieV9jb3VudHlfcGFydG5lci5jc3YiKQ0KYGBgDQoNCkRvd25sb2FkIHRoZSBkYXRhc2V0IGZyb20gdGhlIHRhYmxlIGJlbG93IFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20va2VueWEtZWllLXdnL2VpZV93Z181d3MvYmxvYi9tYWluL2RhdGEvYnJlYWtkb3duX2J5X2NvdW50eV9wYXJ0bmVyLmNzdikuDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiksIH4gDQogICAgICAgICAgICAgIHN0cl9zdWIoLiwgZW5kID0gNTBMKSkgJT4lICANCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgbGVmdF9qb2luKHBhcnRuZXJfbGlzdF9jb3VudGllcyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KHBhcnRuZXIsIGFjcm9ueW0pLCANCiAgICAgICAgICAgIGJ5ID0gYygiaW1wbGVtZW50aW5nX3BhcnRuZXIiID0gInBhcnRuZXIiKSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBsZWFkX29yZ2FuaXNhdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGFjcm9ueW0sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHNlbGVjdF9hbGwoLiwgfiBzdHJfdG9fdGl0bGUoLikpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgY291bnR5IGFuZCBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJSZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygiUmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuMiBTdW1tYXJ5IGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyDQoNClRoZSB0YWJsZSBiZWxvdyBicmVha3MgZG93biBwZXJzb25zIHJlYWNoZWQgYnkgcGFydG5lci4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLjMgU3VtbWFyeSBieSBsZWFkX29yZ2FuaXNhdGlvbg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGxlYWRfb3JnYW5pc2F0aW9uID0gc3RyX3N1YihsZWFkX29yZ2FuaXNhdGlvbiwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgbGVhZCBvcmdhbmlzYXRpb24iKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQogIA0KYGBgDQoNCiMgNC4gU2Nob29scyBhbmQgZWR1Y2F0aW9uIGxldmVsDQoNCiMjIDQuMSBTY2hvb2xzDQoNClRoZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IHNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyBpbnRlcnZlbnRpb25zIHRvLWRhdGUgYXJlOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKG51bWJlcl9zY2hvb2xzKSkgJT4lDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDQiKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2Uoc2Nob29scyA9IHN1bShudW1iZXJfc2Nob29scyksIA0KICAgICAgICAgICAgcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9zY2hvb2xzID0gY3Vtc3VtKHNjaG9vbHMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fc2Nob29scyksIA0KICAgICAgICAgdmp1c3QgPSAtLjUpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuNywgDQogICAgICAgICAgICBhZXMoY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGN1bV9zY2hvb2xzKSksIHZqdXN0ID0gLS41KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzMxNjg4ZSIsICIjZDg1NzZiIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIlNjaG9vbHMgcmVhY2hlZCBieSBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyIsIA0KICAgICAgIGNvbG91ciA9ICJJbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIHJlcG9ydGluZyB0aGUgb3ZlcmFsbCBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IGFsbCBFaUUgaW50ZXJ2ZW50aW9ucyBpcyBtdWNoIG1vcmUgY2hhbGxlbmdpbmcuDQoNCldoaWxzdCBhbGwgcGFydG5lcnMgd29ya2luZyBvbiBpbmRpY2F0b3JzIDIgYW5kIDQgc3VibWl0dGVkIHRoZSBudW1iZXIgb2Ygc2Nob29scyB0aGV5IHdlcmUgd29ya2luZyBpbiwgdGhlIHNhbWUgaXMgbm90IHRydWUgZm9yIHRoZSBvdGhlciBpbmRpY2F0b3JzLiBPbmx5IGluZGljYXRvcnMgMiBhbmQgNCByZXF1aXJlIHRoZSByZXBvcnRpbmcgb2YgdGhlIG51bWJlciBvZiBzY2hvb2xzLg0KDQpBZGRpdGlvbmFsbHksIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBrbm93IHdoaWNoIG9mIHRoZXNlIHNjaG9vbHMgYXJlIHJlcGVhdHMsIHNpbmNlIG9ubHkgdGhlIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQgcGVyIHN1Yi1jb3VudHkgYXJlIHJlcG9ydGVkLCBub3QgdGhlIGluZGl2aWR1YWwgZmFjaWxpdGVzIHRoZW1zZWx2ZXMuDQoNCjxicj48YnI+PGJyPg0KDQojIDUuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMNCg0KIyMgNS4xIFJlZmVyZW5jZSBtYXBzDQoNCklQQyBkYXRhIGV4dHJhY3RlZCBmcm9tIFtoZXJlXShodHRwczovL3d3dy5pcGNpbmZvLm9yZy9pcGMtY291bnRyeS1hbmFseXNpcy9kZXRhaWxzLW1hcC9lbi9jLzExNTY1NDEvP2lzbzM9S0VOKS4NCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEwfQ0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG51bWJlcl9waGFzZV9wMykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShudW1iZXJfcGhhc2VfcDMpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIkF0IGxlYXN0XG5waGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIHBlcnNvbnMgSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsgDQoNCmlwYyAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGVyY2VudF9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQyBwaGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBwb3B1bGF0aW9uIElQQyBQaGFzZSAzIG9yIGFib3ZlIiwgDQogICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBodHRwczovL3d3dy5pcGNpbmZvLm9yZy8iKSArDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBzZWN0b3JfcmVhY2hlZCkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShzZWN0b3JfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yLA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzM5NDgzKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJTZWN0b3JcbnJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgdGhlIEVkdWNhdGlvbiBTZWN0b3IiKSArIA0KICANCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHJlYWNoZWQgPSAwLCB0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUocGMgPSBpZmVsc2UodGFyZ2V0ID09IDAsIDAsIHJlYWNoZWQgLyB0YXJnZXQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgb2YgdGFyZ2V0IiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBFaUUgY291bnR5IHRhcmdldCByZWFjaGVkIikgKyAgIA0KDQpwbG90X2xheW91dChuY29sID0gMiwgDQogICAgICAgICAgICBucm93ID0gMikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuMiBSZWZlcmVuY2UgdGFibGUNCg0KRG93bmxvYWQgdGhlIEVpRSA1V3MgZGF0YSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2VpZV81d3MuY3N2KQ0KDQpBcyBhIHJlZnJlc2hlciBmb3IgdGhlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdywgdGhlIGluZGljYXRvcnMgYXJlOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGluZGljYXRvciwgIjUuMXw1LjJ8NS4zIikpICU+JSANCiAgZGlzdGluY3QoaW5kaWNhdG9yKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKHdpZHRoID0gLjg1LCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgZm9udHNpemUoaSA9IDE6OSwgaiA9IDEsIHNpemUgPSA5KSANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCksIA0KICAgICAgICAgaW5kaWNhdG9yX251bWJlciA9IHBhcnNlX251bWJlcihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgaW5kaWNhdG9yX251bWJlcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3IgPSBpbmRpY2F0b3JfbnVtYmVyLCByZWFjaGVkLCBhZG0xX3Bjb2RlKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGluZGljYXRvciwgY291bnR5IGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygicmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg==